package com.sky.chapter3.lock;

/**
 * @author : wushikai
 * <p>
 * date : 2022-07-04
 * 多个线程 竞争本类静态 实例参数;  2男争一女 ;  2男 意味着 2个线程是同类, 一女 意味着 竞争对象 和线程 有差异化;
 */
public class SynchronizedDemo2 {



    private static int num = 0;

    /**
     * 当synchronized作用于静态方法时，锁的对象就是当前类的Class对象;  多个对象竞争一个 静态 参数
     * 修饰静态方法，作用于类的Class对象，进入修饰的静态方法前需要先获取类的Class对象的锁
     *
     * */
    private static synchronized void m1() {
        for (int i = 0; i < 10000; i++) {
            num++;
        }
    }

    public static class T1 extends Thread {
        @Override
        public void run() {
            SynchronizedDemo2.m1();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        T1 t1 = new T1();
        T1 t2 = new T1();
        T1 t3 = new T1();
        t1.start();
        t2.start();
        t3.start();
        //等待3个线程结束打印num
        t1.join();
        t2.join();
        t3.join();
        System.out.println(SynchronizedDemo2.num);

    }
}
